﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Windows.Forms;

namespace QLKS
{
    class XuLyTraPhong
    {
        public string str_maphieu, str_phongthue, str_ngaythue, str_ngaytra, str_songay, str_dongia, str_dathanhtoan, str_thanhtien;
        private DataSet ds = new DataSet();
        private List<string> tatcakh = new List<string>();

        public DataSet Ds
        {
            get { return ds; }
            set { ds = value; }
        }
        public List<string> Tatcakh
        {
            get { return tatcakh; }
            set { tatcakh = value; }
        }

        /// <summary>
        /// Trả về chuỗi dùng để lấy trường dữ liệu theo yêu cầu cho trước
        /// </summary>
        /// <param name="str_thuoctinh"></param>
        /// <param name="str_tenkh"></param>
        /// <param name="str_cmnd"></param>
        /// <returns></returns>
        private string TruyVan(string str_thuoctinh, string str_tenkh, string str_cmnd)
        {
            return "SELECT " + str_thuoctinh + " FROM PHIEUTHUEPHONG, HOADON, KHACHHANG, PHONG, LOAIPHONG WHERE PHIEUTHUEPHONG.MaPhieu=HOADON.MaPhieu AND KHACHHANG.MaKH=PHIEUTHUEPHONG.MaKH AND PHIEUTHUEPHONG.SoPhong=PHONG.SoPhong AND PHONG.LoaiPhong=LOAIPHONG.LoaiPhong AND KHACHHANG.TenKH=N'" + str_tenkh + "' AND KHACHHANG.CMND='" + str_cmnd + "' AND HOADON.NgayThue=HOADON.NgayTra";
        }

        /// <summary>
        /// Lấy các dữ liệu như: mã khách hàng, mã phiếu, số phòng, ngày thuê, đơn giá,
        /// đã thanh toán, tình trạng, số khách không phụ thu, phụ thu, phụ thu nước ngoài;
        /// tính số ngày, tính thành tiền
        /// </summary>
        /// <param name="str_tenkh"></param>
        /// <param name="str_cmnd"></param>
        public void HienThi(string str_tenkh,string str_cmnd)
        {
            DataSet ds2 = new DataSet();
            int tinhtrang = 0;
            int sokhachkhongphuthu = 0;
            decimal phuthu = 0;
            decimal phuthunuocngoai = 0;
            decimal thanhtien = 0;
            CultureInfo culture = new CultureInfo("en-US");
            try
            {
                LayDuLieu dl = new LayDuLieu();
                ds = dl.LayBangDuLieu("SELECT KHACHHANG.TenKH AS [Tên khách hàng], KHACHHANG.CMND AS [CMND] FROM KHACHHANG, PHIEUTHUEPHONG WHERE PHIEUTHUEPHONG.MaKH=KHACHHANG.MaKH AND PHIEUTHUEPHONG.MaPhieu=(" + TruyVan(" PHIEUTHUEPHONG.MaPhieu", str_tenkh, str_cmnd) + ")");
                SqlDataReader dr = dl.LayTruongDuLieu("SELECT KHACHHANG.MaKH FROM KHACHHANG, PHIEUTHUEPHONG WHERE PHIEUTHUEPHONG.MaKH=KHACHHANG.MaKH AND PHIEUTHUEPHONG.MaPhieu=(" + TruyVan(" PHIEUTHUEPHONG.MaPhieu", str_tenkh, str_cmnd) + ")");
                ds2 = dl.LayBangDuLieu("SELECT KHACHHANG.TenKH AS [Tên khách hàng], KHACHHANG.CMND AS [CMND], KHACHHANG.MaLK AS [Mã LK] FROM KHACHHANG, PHIEUTHUEPHONG WHERE PHIEUTHUEPHONG.MaKH=KHACHHANG.MaKH AND KHACHHANG.MaLK='LK002' AND PHIEUTHUEPHONG.MaPhieu=(" + TruyVan(" PHIEUTHUEPHONG.MaPhieu", str_tenkh, str_cmnd) + ")");
                SqlDataReader dr0 = dl.LayTruongDuLieu(TruyVan("PHIEUTHUEPHONG.MaPhieu", str_tenkh, str_cmnd));
                SqlDataReader dr1 = dl.LayTruongDuLieu(TruyVan("PHIEUTHUEPHONG.SoPhong", str_tenkh, str_cmnd));
                SqlDataReader dr2 = dl.LayTruongDuLieu(TruyVan("PHIEUTHUEPHONG.NgayThue", str_tenkh, str_cmnd));
                SqlDataReader dr3 = dl.LayTruongDuLieu(TruyVan("LOAIPHONG.DonGia", str_tenkh, str_cmnd));
                SqlDataReader dr4 = dl.LayTruongDuLieu(TruyVan("PHIEUTHUEPHONG.DaThanhToan", str_tenkh, str_cmnd));
                SqlDataReader dr5 = dl.LayTruongDuLieu(TruyVan("PHONG.TinhTrang", str_tenkh, str_cmnd));
                SqlDataReader dr6 = dl.LayTruongDuLieu("SELECT SoKhachKhongPhuThu FROM THAMSO");
                SqlDataReader dr7 = dl.LayTruongDuLieu("SELECT PhuThu FROM THAMSO");
                SqlDataReader dr8 = dl.LayTruongDuLieu("SELECT PhuThuNuocNgoai FROM THAMSO");
                while (dr.Read())
                {
                    tatcakh.Add(dr.GetString(0));
                }
                while (dr0.Read())
                {
                    str_maphieu = dr0.GetString(0);
                }
                while (dr1.Read())
                {
                    str_phongthue = dr1.GetValue(0).ToString();
                }
                while (dr2.Read())
                {
                    str_ngaythue = dr2.GetDateTime(0).ToString("d", culture);
                }
                while (dr3.Read())
                {
                    str_dongia = Math.Round(dr3.GetDecimal(0), 0).ToString();
                }
                while (dr4.Read())
                {
                    str_dathanhtoan = Math.Round(dr4.GetDecimal(0), 0).ToString();
                }
                while (dr5.Read())
                {
                    tinhtrang = Convert.ToInt32(dr5.GetValue(0));
                }
                while (dr6.Read())
                {
                    sokhachkhongphuthu = Convert.ToInt32(dr6.GetValue(0));
                }
                while (dr7.Read())
                {
                    phuthu = Convert.ToDecimal(dr7.GetValue(0));
                }
                while (dr8.Read())
                {
                    phuthunuocngoai = Convert.ToDecimal(dr8.GetValue(0));
                }
                KetNoi.NgatKetNoi();
            }
            catch { }
            str_ngaytra = DateTime.Today.ToString("d", culture);
            TimeSpan ts = Convert.ToDateTime(str_ngaytra, culture) - Convert.ToDateTime(str_ngaythue, culture);
            str_songay = ts.TotalDays.ToString();
            decimal temp = (Convert.ToDecimal(str_dongia) * Convert.ToDecimal(str_songay) - Convert.ToDecimal(str_dathanhtoan));
            thanhtien = Math.Round(temp, 0);
            if (tinhtrang > sokhachkhongphuthu)
            {
                thanhtien = Math.Round(thanhtien * (1 + phuthu), 0);
            }
            if (ds2.Tables[0].Rows.Count != 0)
            {
                thanhtien = Math.Round(thanhtien * (1 + phuthunuocngoai), 0);
            }
            str_thanhtien = thanhtien.ToString();
        }

        /// <summary>
        /// Ghi thông tin như: ngày trả, số ngày, đơn giá, thành tiền
        /// và cập nhật tình trạng phòng trong CSDL
        /// </summary>
        /// <returns></returns>
        public bool CapNhatHoaDon()
        {
            bool kt = true;
            try
            {
                LayDuLieu dl = new LayDuLieu();
                if (dl.GhiDuLieu("UPDATE HOADON SET NgayTra='" + str_ngaytra + "' WHERE MaPhieu='" + str_maphieu + "'") == false)
                    kt = false;
                if (dl.GhiDuLieu("UPDATE HOADON SET SoNgay='" + str_songay + "' WHERE MaPhieu='" + str_maphieu + "'") == false)
                    kt = false;
                if (dl.GhiDuLieu("UPDATE HOADON SET DonGia=" + str_dongia + " WHERE MaPhieu='" + str_maphieu + "'") == false)
                    kt = false;
                if (dl.GhiDuLieu("UPDATE HOADON SET ThanhTien=" + str_thanhtien + " WHERE MaPhieu='" + str_maphieu + "'") == false)
                    kt = false;
                if (dl.GhiDuLieu("UPDATE PHONG SET TinhTrang=0 WHERE SoPhong=" + str_phongthue) == false)
                    kt = false;
            }
            catch { return false; }
            return kt;
        }

        /// <summary>
        /// Kiểm tra xem báo cáo của tháng hiện tại có rồi hay chưa,
        /// nếu chưa có thì gọi hàm TaoBaoCao(), ngược lại gọi hàm CapNhatBaoCao()
        /// </summary>
        /// <returns></returns>
        public bool CapNhatBaoCaoDoanhThu()
        {
            bool kt = true;
            try
            {
                LayDuLieu dl = new LayDuLieu();
                DataSet ds = dl.LayBangDuLieu("SELECT * FROM BAOCAODOANHTHU WHERE Thang=" + DateTime.Now.Month.ToString() + " AND Nam=" + DateTime.Now.Year.ToString());
                if (ds.Tables[0].Rows.Count == 0)
                {
                    if (TaoBaoCao() == false)
                        kt = false;
                }
                else
                {
                    if (CapNhatBaoCao() == false)
                        kt = false;
                }
                KetNoi.NgatKetNoi();
            }
            catch { return false; }
            return kt;
        }

        /// <summary>
        /// Tạo thông tin báo cáo mới nếu thông tin báo cáo của tháng hiện tại chưa có,
        /// sau đó gọi hàm CapNhatBaoCao() để cập nhật báo cáo 1 cách đầy đủ
        /// </summary>
        /// <returns></returns>
        private bool TaoBaoCao()
        {
            bool kt = true;
            try
            {
                LayDuLieu dl = new LayDuLieu();
                SqlDataReader dr = dl.LayTruongDuLieu("SELECT LoaiPhong FROM LOAIPHONG");
                while (dr.Read())
                {
                    if (dl.GhiDuLieu("INSERT INTO BAOCAODOANHTHU VALUES(" + DateTime.Now.Month.ToString() + "," + DateTime.Now.Year.ToString() + ",'" + dr.GetString(0) + "',0,0)") == false)
                        kt = false;
                }
                if (CapNhatBaoCao() == false)
                    kt = false;
                KetNoi.NgatKetNoi();
            }
            catch { return false; }
            return kt;
        }

        /// <summary>
        /// Cập nhật thông tin: doanh thu, tỷ lệ cho tất cả loại phòng có trong khách sạn
        /// </summary>
        /// <returns></returns>
        private bool CapNhatBaoCao()
        {
            bool kt = true;
            decimal doanhthutheolp = 0;
            decimal tongdoanhthu = 0;
            decimal tyle = 0;
            try
            {
                LayDuLieu dl = new LayDuLieu();
                SqlDataReader dr2 = dl.LayTruongDuLieu(
                    @"SELECT SUM(V.ThanhTien) FROM
                    (SELECT DISTINCT HOADON.ThanhTien
                    FROM HOADON, PHIEUTHUEPHONG, PHONG, LOAIPHONG
                    WHERE HOADON.MaPhieu=PHIEUTHUEPHONG.MaPhieu
	                    AND PHIEUTHUEPHONG.SoPhong=PHONG.SoPhong
	                    AND PHONG.LoaiPhong=LOAIPHONG.LoaiPhong
	                    AND MONTH(HOADON.NgayTra)=" + DateTime.Now.Month.ToString() + " AND YEAR(HOADON.NgayTra)=" + DateTime.Now.Year.ToString() + ")V");
                while (dr2.Read())
                {
                    tongdoanhthu = Convert.ToDecimal(dr2.GetValue(0));
                }
                SqlDataReader dr = dl.LayTruongDuLieu("SELECT LoaiPhong FROM LOAIPHONG");
                while (dr.Read())
                {
                    SqlDataReader dr1 = dl.LayTruongDuLieu(
                        @"SELECT SUM(V.ThanhTien) FROM
                        (SELECT DISTINCT HOADON.ThanhTien
                        FROM HOADON, PHIEUTHUEPHONG, PHONG, LOAIPHONG
                        WHERE HOADON.MaPhieu=PHIEUTHUEPHONG.MaPhieu
	                    AND PHIEUTHUEPHONG.SoPhong=PHONG.SoPhong
	                    AND PHONG.LoaiPhong=LOAIPHONG.LoaiPhong
	                    AND MONTH(HOADON.NgayTra)=" + DateTime.Now.Month.ToString() + " AND YEAR(HOADON.NgayTra)=" + DateTime.Now.Year.ToString() + " AND PHONG.LoaiPhong='" + dr.GetString(0) + "')V");
                    while (dr1.Read())
                    {
                        if (dr1.GetValue(0).ToString() == "")
                        {
                            doanhthutheolp = 0;
                        }
                        else
                        {
                            doanhthutheolp = Convert.ToDecimal(dr1.GetValue(0));
                        }
                    }
                    tyle = (doanhthutheolp / tongdoanhthu) * 100;
                    if (dl.GhiDuLieu("UPDATE BAOCAODOANHTHU SET DoanhThu=" + doanhthutheolp.ToString() + ", TyLe=" + tyle.ToString() + " WHERE Thang=" + DateTime.Now.Month.ToString() + " AND Nam=" + DateTime.Now.Year.ToString() + " AND LoaiPhong='" + dr.GetString(0) + "'") == false)
                        kt = false;
                    KetNoi.NgatKetNoi();
                }
            }
            catch { return false; }
            return kt;
        }
    }
}
